/*
 * estructuras.h
 *
 *  Created on: 15-jul-2009
 *      Author: Pablo Izquierdo & Adrián Romero
 *
 *      Almacena las estructuras necesarias para guardar la información de
 *      formato de mensajes DHCP, mensajes que se van a enviar al servidor y
 *      los parametros de configuracion que se introducen por teclado al
 *      comenzar la ejecucion.
 */

#ifndef ESTRUCTURAS_H_
#define ESTRUCTURAS_H_

#include "constantes.h"
#include <sys/types.h>

// Estructura para un mensaje DHCP

struct DatosDhcp{
	unsigned char op; //valores posibles: 1 -> de cliente a servidor(request), 2 -> de servidor a cliente(reply)
	unsigned char htype; //siempre un 1 porque solo trabajamos en la capa hardware con Ethernet
	unsigned char hlen; //longitud de la direccion de la capa hardware(en nuestro caso: Ethernet=6)
	unsigned char hops; //numero de saltos del mensaje entre relay agents(el cliente lo pone a cero)
	unsigned int xid; //identificador para que cliente y servidor relacionen las peticiones, lo rellena el cliente con un numero aleatorio
	unsigned short secs; //segundos desde que empezo la peticion (request) del cliente
	unsigned short flags; //los ultimos 15 bits a 0, el primer bit a 1 indica que es a broadcast
	unsigned int ciaddr; // direccion internet cliente (ip), la que quiero obtener
	unsigned int yiaddr; // direccion ip que ofrece el servidor al cliente en el mensaje DHCPOFFER
	unsigned int siaddr; // direccion ip del servidor
	unsigned int giaddr; // direccion del siguiente relay agent (creo q no se usa nunca --> siempre a 0)
	char chaddr[16]; // direccion hardware del cliente (la mac, direccion Ethernet)
	char sname[64]; // siempre a null (cadena de caracteres)
	char file[128]; // siempre a null (cadena de caracteres)
	unsigned int longitudCampoOpciones;//longitud del campo opciones(añadido a la estructura original)
	char *options; //opciones definidas en RFC2132 (los 4 primeros bytes son la 'magic cookie')
};

/*
 * Almacena la estructura del mensaje DHCP en una cadena de char para enviar
 * al servidor por la red de comunicacion.
 */
struct CadenaDhcp{
	unsigned int longitud; // longitud del mensaje DHCP
	unsigned char *contenido; // cadena de char con la informacion del mensaje completo
};

// Almacena los datos de un mensaje ARP
struct DatosArp{
	unsigned short htype; //tipo de hardware
	unsigned short ptype; //tipo de protocolo
	unsigned char hlen; //longitud direccion hardware
	unsigned char plen; //longitud direccion protocolo
	unsigned short oper; //operacion (1: request, 2: reply)
	char sha[6]; //direccion hardware del emisor
	unsigned int spa; //direccion IP del emisor
	char tha[6]; //direccion hardware del objetivo
	unsigned int tpa; //direccion IP del objetivo
};

#endif /* ESTRUCTURAS_H_ */
